/***********************************************************************
 * 描述:		该类为访问HTTP接口的封装类，其主要是调用了cURL库
 * File:    httpclient.h
 * Author:  liquan@mozihealthcare.cn
 * Date:    2025-10-10
 * Update:
 **********************************************************************/

#ifndef HTTPCLIENT_H
#define HTTPCLIENT_H

#include <iostream>
#include <map>

/**
 * HTTP客户端访问类
 */
class HttpClient
{
public:
	/**
	 * 构造函数
	 * @param url 请求HTTP地址
	 */
	explicit HttpClient(std::string url);
	// 析构函数
	~HttpClient();
	// 禁用拷贝构造和赋值操作
	HttpClient(const HttpClient&) = delete;
	HttpClient& operator=(const HttpClient&) = delete;
	// 移动构造和移动赋值
	HttpClient(HttpClient&&) = default;
	HttpClient& operator=(HttpClient&&) = default;

	/**
	 * 设置请求头
	 * @param name 请求头的键
	 * @param value 请求头的值
	 */
	void setHeader(const std::string& name, const std::string& value);
	/**
	 * 获取HTTP请求状态码
	 * @return 状态码
	 */
	long httpCode() const;
	/**
	 * 获取错误信息
	 * @return 错误信息
	 */
	std::string error() const;
	/**
	 * 发送POST请求
	 * @param requestData 请求发送的数据
	 * @param responseData 请求返回的数据
	 * @return 请求状态，true-成功，false-失败
	 */
	bool post(const std::string& requestData, std::string& responseData);

private:
	std::string m_url;                           // 请求HTTP地址
	std::map<std::string, std::string> m_headers;// 请求头
	long m_httpCode;                             // HTTP状态码
	std::string m_error;                         // 错误信息
	/**
	 * @brief curl写数据回调函数
	 * @param ptr 数据指针
	 * @param size 每个数据单元大小
	 * @param nMemb 数据单元数量
	 * @param userData 用户数据指针
	 * @return 实际处理的数据大小
	 */
	static size_t writeCallback(void* ptr, size_t size, size_t nMemb, std::string* userData);
};

#endif //HTTPCLIENT_H
